package com.example.forum.service.impl;

import com.example.forum.entity.User;
import com.example.forum.mapper.UserMapper;
import com.example.forum.service.IUserService;
import com.example.forum.service.ex.InsertException;
import com.example.forum.service.ex.UsernameDuplicatedException;
import com.sun.org.apache.bcel.internal.generic.RETURN;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.DigestUtils;

import javax.annotation.Resource;
import java.util.UUID;

//用户模块业务层的实现类
@Service //将当前类的对象交给Spring来管理，自动创建对象以及对象的维护
public class UserServiceImpl implements IUserService {
    @Resource
    private UserMapper userMapper;


    @Override
    public void reg(User user) {
        //调用mapper的user,查找是否存在
        User result = userMapper.selectUser(user.getUsername());
        //判断result如果不是null，则抛出用户名被占用的异常；
        if(result!=null){ throw new UsernameDuplicatedException("用户名被占用");
        }
        //密码加密处理的实现：MD5
        /**
         *串+password+串   ——————》》》md5算法加密3次，连续加载3次
         * 盐值 + password +盐值  盐值就是随机字符串
         *
         */
        String oldPassword=user.getPassword();
        String salt= UUID.randomUUID().toString().toUpperCase();
        String md5password=getMd5Password(oldPassword,salt);
        //将加密之后的密码重新补全设置到user对象中
        user.setPassword(md5password);

        //补全数据user.setSalt(salt)
        user.setMobile("12634986");


        //执行注册业务功能的实现
        Integer rows=userMapper.insert(user);
        if(rows!=1){throw new InsertException("在用户注册过程中产生了未知的异常，服务器宕机");
        }
    }

    //定义一个md5算法的加密处理
    private String getMd5Password(String password,String salt){
        //无视原始密码强度，使用uuid作为盐值，在原始密码左右两侧拼接，循环加密3次
        //md5加密算法调用  3次
        for(int i=0;i<3;i++){
            password=DigestUtils.md5DigestAsHex((salt+password+salt).getBytes()).toUpperCase();
        }
        return  password;

    }




}
